package daos;

import java.util.ArrayList;
import java.util.Calendar;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import entidades.Atleta;

public class AtletaDAO {
	private Session sesion;
	private Transaction tx;

	public Integer guardaAtleta(Atleta atleta) throws HibernateException {
		Integer id = 0;

		try {
			iniciaOperacion();
			id = (Integer) sesion.save(atleta);
			tx.commit();
		} catch (HibernateException he) {
			manejaExcepcion(he);
			throw he;
		} finally {
			sesion.close();
		}

		return id;
	}

	public void actualizaAtleta(Atleta atleta) throws HibernateException {
		try {
			iniciaOperacion();
			sesion.update(atleta);
			tx.commit();
		} catch (HibernateException he) {
			manejaExcepcion(he);
			throw he;
		} finally {
			sesion.close();
		}
	}

	public void eliminaAtleta(Atleta atleta) throws HibernateException {
		try {
			iniciaOperacion();
			sesion.delete(atleta);
			tx.commit();
		} catch (HibernateException he) {
			manejaExcepcion(he);
			throw he;
		} finally {
			sesion.close();
		}
	}

	public Atleta obtenAtleta(Integer idAtleta) throws HibernateException {
		Atleta atleta = null;
		try {
			iniciaOperacion();
			atleta = (Atleta) sesion.get(Atleta.class, idAtleta);
		} finally {
			sesion.close();
		}

		return atleta;
	}


	@SuppressWarnings("unchecked")
	public ArrayList<Atleta> obtenListaAtleta() throws HibernateException {
		ArrayList<Atleta> listaAtletas = new ArrayList<Atleta>();

		try {
			iniciaOperacion();
			listaAtletas = new ArrayList<Atleta>(sesion.createQuery("from Atleta").list());
		} finally {
			sesion.close();
		}

		return listaAtletas;
	}

	public Atleta actualizarDeudaAtleta(Integer idAtleta) {
		Atleta atleta;
		Integer deuda;

		try {
			atleta = obtenAtleta(idAtleta);
			System.out.println(atleta.getNombres());
			if (!atleta.isBecado()) {
				if (atleta.isActivo()) {
					deuda = obtenDeuda(atleta);
					atleta.setDeuda(deuda);
					System.out.println(atleta.getDeuda());
					if (atleta.getDeuda() >= 3)
						atleta.setActivo(false);
				}
			}
			actualizaAtleta(atleta);

		} catch (HibernateException he) {
			System.out.println("falooooooooooooooooooooo");
			manejaExcepcion(he);
			throw he;

		}
		return atleta;
	}

	private Integer obtenDeuda(Atleta atleta) {
		Integer meses = 0;
		Calendar now = Calendar.getInstance();
		Calendar ultimoPago = Calendar.getInstance();
		Calendar fechaInscripcion = Calendar.getInstance();
		//now.set(2014, 07, 14);
		ultimoPago.setTime(atleta.getUltimoPago());
		fechaInscripcion.setTime(atleta.getFechaInscripcion());

		if (ultimoPago.get(Calendar.YEAR) == now.get(Calendar.YEAR)) {
			meses = (now.get(Calendar.MONTH) - ultimoPago.get(Calendar.MONTH));
		} else {
			meses = ((ultimoPago.get(Calendar.MONTH) + 12) - now
					.get(Calendar.MONTH));
		}

		if (now.get(Calendar.DAY_OF_MONTH) < fechaInscripcion
				.get(Calendar.DAY_OF_MONTH))
			meses--;

		return meses;
	}
	
	@SuppressWarnings("unchecked")
	public ArrayList<Atleta> consultarAtleta(String s) throws HibernateException {
		ArrayList<Atleta> listaAtletas = new ArrayList<Atleta>();

		try {
			iniciaOperacion();
			Query q = sesion.createSQLQuery("SELECT * FROM atleta WHERE nombres LIKE :string or apellidos LIKE :string").addEntity(Atleta.class);
//			Query q = sesion.createQuery("from Material as m where m.descripcion = :string");
			q.setParameter("string", "%"+ s+"%");
			
			listaAtletas = new ArrayList<Atleta>(q.list());
		} finally {
			sesion.close();
		}

		return listaAtletas;
	}
	
	void iniciaOperacion() throws HibernateException {
		sesion = HibernateUtil.getSessionFactory().openSession();
		tx = sesion.beginTransaction();
	}

	private void manejaExcepcion(HibernateException he)
			throws HibernateException {
		tx.rollback();
		throw new HibernateException(
				"Ocurrió un error en la capa de acceso a datos", he);
	}
}
